package org.galaxyworld.flycode.utils;

import com.google.common.base.CaseFormat;
import org.apache.commons.lang3.StringUtils;
import org.galaxyworld.flycode.config.ModelConfig;

import java.util.HashSet;
import java.util.Set;

public class NameUtils {

    private static final Set KEYWORDS = new HashSet<String>() {
        {
            add("abstract");
            add("assert");
            add("boolean");
            add("break");
            add("byte");
            add("case");
            add("catch");
            add("char");
            add("class");
            add("const");
            add("continue");
            add("default");
            add("do");
            add("double");
            add("else");
            add("enum");
            add("extends");
            add("final");
            add("finally");
            add("float");
            add("for");
            add("goto");
            add("if");
            add("implements");
            add("import");
            add("instanceof");
            add("int");
            add("interface");
            add("long");
            add("native");
            add("new");
            add("package");
            add("private");
            add("protected");
            add("public");
            add("return");
            add("strictfp");
            add("short");
            add("static");
            add("super");
            add("switch");
            add("synchronized");
            add("this");
            add("throw");
            add("throws");
            add("transient");
            add("try");
            add("void");
            add("volatile");
            add("while");
        }
    };

    /**
     * Formats to valid class name.
     *
     * @param tableName the name to be formatted
     * @param prefix prefix
     * @param includePrefix whether need prepend the prefixes
     * @return formatted class name
     */
    public static String tableNameToClassName(String tableName, String prefix, boolean includePrefix) {
        String name = tableName;
        if (!includePrefix) {
            if (StringUtils.startsWith(tableName, prefix)) {
                name = StringUtils.substringAfter(tableName, prefix);
            }
        }
        return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name);
    }

    /**
     * Gets a valid variable name of Java.
     *
     * This will filter any Java keywords with keyword postfix.
     *
     * @param columnName column name
     * @return a valid variable name
     */
    public static String columnNameToMemberName(String columnName) {
        String name = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, columnName);
        return KEYWORDS.contains(name) ? String.format("%s%s", name, ModelConfig.getKeywordPostfix()) : name;
    }

    /**
     * Check if the column name will be converted to a Java keyword.
     *
     * @param columnName column name
     * @return true if the column name will be converted to a keyword
     */
    private static boolean isKeyword(String columnName) {
        String name = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, columnName);
        return KEYWORDS.contains(name);
    }

}
